From: Florian Müllner Date: Fri, 18 May 2012 21:57:04 +0000 (+0200) Subject: main: Make sure that --mode parameter is valid X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~6567 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=a7a46bbe1cac8d3512679637cd75e53e9e98c121;p=gnome-shell.git main: Make sure that --mode parameter is valid Instead of falling back to a set of default values or crashing the window manager when an invalid mode is specified, check the value of the ShellGlobal:session-mode property before taking over as WM and make a clean exit if it cannot be resolved to an existent mode. https://bugzilla.gnome.org/show_bug.cgi?id=676156 --- diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js index 0cc2c14f9..1ed5aaa21 100644 --- a/js/ui/sessionMode.js +++ b/js/ui/sessionMode.js @@ -13,6 +13,11 @@ const _modes = { 'user': { sessionType: Shell.SessionType.USER } }; +function modeExists(mode) { + let modes = Object.getOwnPropertyNames(_modes); + return modes.indexOf(mode) != -1; +} + const SessionMode = new Lang.Class({ Name: 'SessionMode', diff --git a/src/main.c b/src/main.c index bd3b128b0..97ad90af2 100644 --- a/src/main.c +++ b/src/main.c @@ -335,6 +335,12 @@ main (int argc, char **argv) _shell_global_init ("session-mode", session_mode, NULL); + if (!_shell_global_has_valid_session_mode (shell_global_get ())) + { + g_printerr ("\"%s\" is not a valid mode.\n", session_mode); + exit(1); + } + ecode = meta_run (); if (g_getenv ("GNOME_SHELL_ENABLE_CLEANUP")) diff --git a/src/shell-global-private.h b/src/shell-global-private.h index 62f7c2603..45e204ff3 100644 --- a/src/shell-global-private.h +++ b/src/shell-global-private.h @@ -13,6 +13,7 @@ void _shell_global_set_plugin (ShellGlobal *global, GjsContext *_shell_global_get_gjs_context (ShellGlobal *global); +gboolean _shell_global_has_valid_session_mode (ShellGlobal *global); gboolean _shell_global_check_xdnd_event (ShellGlobal *global, XEvent *xev); diff --git a/src/shell-global.c b/src/shell-global.c index 01950190c..bc5a5c16d 100644 --- a/src/shell-global.c +++ b/src/shell-global.c @@ -597,6 +597,21 @@ shell_global_set_stage_input_mode (ShellGlobal *global, } } +gboolean +_shell_global_has_valid_session_mode (ShellGlobal *global) +{ + char *script; + int status; + + script = g_strdup_printf ("imports.ui.environment.init();" + "imports.ui.sessionMode.modeExists('%s') || 1;", + global->session_mode); + gjs_context_eval (global->js_context, script, -1, "", &status, NULL); + g_free (script); + + return status == 0; +} + /** * shell_global_set_cursor: * @global: A #ShellGlobal